package com.zf.fastexcel.utils;

import cn.idev.excel.context.AnalysisContext;
import cn.idev.excel.enums.CellDataTypeEnum;
import cn.idev.excel.metadata.GlobalConfiguration;
import cn.idev.excel.metadata.data.ReadCellData;
import cn.idev.excel.util.DateUtils;
import cn.idev.excel.util.NumberDataFormatterUtils;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Objects;
import java.util.Optional;

/**
 * FastExcel单元格 ReadCellData 读取工具，在 AnalysisEventListener 监听器中使用
 *
 * @author Zhou Feng
 */
public class ReadCellDataUtils {

    /**
     * 获取单元格的内容，返回字符串，通用格式
     */
    public static String getCellValueToString(ReadCellData<?> cellData, AnalysisContext context, DateTimeFormatter dateTimeFormatter) {
        if (cellData.getType() == CellDataTypeEnum.EMPTY || cellData.getType() == CellDataTypeEnum.ERROR) {
            return "";
        }
        GlobalConfiguration globalConfiguration = context.readWorkbookHolder().getGlobalConfiguration();
        Boolean use1904windowing = globalConfiguration.getUse1904windowing();
        Short formatIndex = cellData.getDataFormatData().getIndex();
        String formatString = cellData.getDataFormatData().getFormat();
        // 字符串类型
        if (cellData.getType() == CellDataTypeEnum.STRING) {
            return Optional.ofNullable(cellData.getStringValue()).orElse("");
        }
        // 数字类型
        if (cellData.getType() == CellDataTypeEnum.NUMBER && !DateUtils.isADateFormat(formatIndex, formatString)) {
            return cellData.getNumberValue().toPlainString();
        }
        // 日期类型
        if (cellData.getType() == CellDataTypeEnum.NUMBER && DateUtils.isADateFormat(formatIndex, formatString)) {
            if (Objects.isNull(dateTimeFormatter)) {
                return "";
            }
            // 1、NumberDataFormatterUtils.format() 读取excel中展示的时间格式：
            //      存在例外情况，比如时间“2024/4/3 23:33:43” 在Excel中默认展示的时间样式是“2024/4/3 23:33”，但是读取的结果却是 “2024-4-3 23:33”
            //      所以最好在Excel显示设置展示的日期格式，这样读取的数据格式就是展示的格式
            return NumberDataFormatterUtils.format(cellData.getOriginalNumberValue(), formatIndex, formatString, globalConfiguration);

            // 2、或者使用 DateUtils.getLocalDateTime() 读取时间，转为指定的格式，可以读取到完整的时间
            // LocalDateTime localDateTime = DateUtils.getLocalDateTime(cellData.getOriginalNumberValue().doubleValue(), use1904windowing);
            // return dateTimeFormatter.format(localDateTime);
        }
        // 布尔类型
        if (cellData.getType() == CellDataTypeEnum.BOOLEAN) {
            return String.valueOf(cellData.getBooleanValue());
        }
        return "";
    }


    /**
     * 读取单元格数据-字符串
     */
    public static String getStringValue(ReadCellData<?> cellData) {
        if (cellData.getType() == CellDataTypeEnum.STRING) {
            return cellData.getStringValue();
        }
        return "";
    }

    /**
     * 读取单元格数据-数字字符串
     */
    public static String getNumberValueToString(ReadCellData<?> cellData) {
        Short formatIndex = cellData.getDataFormatData().getIndex();
        String formatString = cellData.getDataFormatData().getFormat();
        if (cellData.getType() == CellDataTypeEnum.NUMBER && !DateUtils.isADateFormat(formatIndex, formatString)) {
            return cellData.getNumberValue().toPlainString();
        }
        return "";
    }

    /**
     * 读取单元格数据-日期
     */
    public static LocalDateTime getDateValue(ReadCellData<?> cellData, AnalysisContext context) {
        Boolean use1904windowing = context.readWorkbookHolder().getGlobalConfiguration().getUse1904windowing();
        Short formatIndex = cellData.getDataFormatData().getIndex();
        String formatString = cellData.getDataFormatData().getFormat();
        if (cellData.getType() == CellDataTypeEnum.NUMBER && DateUtils.isADateFormat(formatIndex, formatString)) {
            return DateUtils.getLocalDateTime(cellData.getOriginalNumberValue().doubleValue(), use1904windowing);
        }
        return null;
    }


    /**
     * 读取单元格数据-日期字符，指定格式化样式
     */
    public static String getDateValueToString(ReadCellData<?> cellData, AnalysisContext context, DateTimeFormatter dateTimeFormatter) {
        if (Objects.isNull(dateTimeFormatter)) {
            return "";
        }
        Boolean use1904windowing = context.readWorkbookHolder().getGlobalConfiguration().getUse1904windowing();
        // Short formatIndex = cellData.getDataFormatData().getIndex();
        // String formatString = cellData.getDataFormatData().getFormat();
        // 该方法会读取excel中展示的日期格式，但是 “2024/4/3 23:23” 格式会被读取并格式化为 “2024-4-3 23:23”
        // return NumberDataFormatterUtils.format(cellData.getOriginalNumberValue(), formatIndex, formatString, globalConfiguration);
        LocalDateTime localDateTime = DateUtils.getLocalDateTime(cellData.getOriginalNumberValue().doubleValue(), use1904windowing);
        return dateTimeFormatter.format(localDateTime);
    }

    /**
     * 读取单元格数据-boolean字符串
     */
    public static String getBooleanValueToString(ReadCellData<?> cellData, AnalysisContext context) {
        if (cellData.getType() != CellDataTypeEnum.BOOLEAN) {
            return String.valueOf(cellData.getBooleanValue());
        }
        return "";
    }
}
